import { fail } from "assert";
import dayjs from "dayjs";
import debounce from "./debounce";
/*
tost
msg:弹框的内容
isDelay：是不是要延迟弹。避免和网络请求的转圈给关了看不见效果
*/
export function toast(msg: string, isDelay?: boolean) {
  if (isDelay) {
    setTimeout(() => {
      uni.showToast({
        title: msg,
        duration: 2000,
        mask: false,
        icon: "none"
      });
    }, 100);
  } else {
    uni.showToast({
      title: msg,
      duration: 2000,
      mask: false,
      icon: "none"
    });
  }
}
/*
有确定取消按钮的弹框
msg：弹框内容
callBackFun：回调方法  true确定按钮的传值 false取消按钮传值
*/
export function zconfirm(msg: string, callBackFun?: any) {
  uni.showModal({
    content: msg,
    success: function (res) {
      if (res.confirm) {
        callBackFun(true);
      } else if (res.cancel) {
        callBackFun(false);
      }
    }
  });
}
/*
只有一个按钮的弹框
msg：弹框内容
callBackFun：回调方法
*/
export function zalert(msg: string, callBackFun?: any) {
  debounce(() => {
    uni.showModal({
      title: "温馨提示",
      content: msg,
      showCancel: false,
      success: function () {
        if (callBackFun) {
          callBackFun();
        }
      }
    });
  }, 500);
}

//深拷贝
export const deepClone = function (origin: any, target: object = {}) {
  for (const prop in target) {
    if (target[prop] !== null && typeof target[prop] === "object") {
      origin[prop] = Object.prototype.toString.call(target[prop]) === "[object Array]" ? [] : {};
      deepClone(origin[prop], target[prop]);
    } else {
      origin[prop] = target[prop];
    }
  }
};

// 预览文件 url 文件的url地址  name：文件的名称
export const openFile = (url: string, name: string) => {
  let type = name.split(".")[name.split(".").length - 1];
  let image = ["JPG", "JPEG", "PNG"];
  let file = ["DOC", "XLS", "PPT", "PDF", "DOCX", "XLSX", "PPTX"];
  let urls = [];
  urls.push(url);
  // 如果文件是图片类型
  if (image.indexOf(type.toLocaleUpperCase()) > -1) {
    uni.previewImage({
      urls: urls,
      fail: (e) => {
        toast(e);
      }
    });
  }
  // 如果文件是DOC/XLS/PPT/PDF/DOCX/XLSX/PPTX类型
  else if (file.indexOf(type.toLocaleUpperCase()) > -1) {
    // 小程序配置的合法域名为https协议
    // if (url.indexOf("http") > -1 && url.indexOf("https") === -1) {
    //   url = url.replace("http", "https");
    // }
    uni.downloadFile({
      url: url,
      success: function (res) {
        var filePath = res.tempFilePath;
        uni.openDocument({
          filePath: filePath,
          fileType: type.toLocaleLowerCase(),
          showMenu: true,
          fail: (e: any) => {
            // 提示：预览文件失败
            toast(e);
          }
        });
      },
      fail: function (err) {
        // 提示：预览文件失败
        toast(err);
      }
    });
  } else {
    toast("暂不支持查看该类型文件,请前往PC端进行相关操作");
    // 提示：此类型文件暂不支持预览
  }
};

/**
 * 日期时间格式化
 * @param date 日期时间
 * @param format 格式
 * @returns
 */
export const dateFormatter = (date: Date | string, format: string = "YYYY-MM-DD HH:mm:ss") => {
  if (!date) return "";
  return dayjs(date).format(format);
};

/**
 * 获取当前时间
 * @param format 格式
 * @returns
 */
export const getNowFormatterDate = (format: string = "YYYY-MM-DD HH:mm:ss") => {
  const now = new Date();
  return dateFormatter(now, format);
};

/*获取当前显示页面的路由
  例如首页 pages/home/home
	getCurrentPages() 函数用于获取当前页面栈的实例，以数组形式按栈的顺序给出，第一个元素为首页，最后一个元素为当前页面。
 */
export function containCurrentPageRouter(): string {
  const pages = getCurrentPages();
  if (pages && pages.length > 0) {
    return pages[pages.length - 1].route;
  }
  return "";
}

export function at_scanCode() {
  return new Promise((resolve, reject) => {
    uni.scanCode({
      sound: "default",
      fail: (err) => {
        toast(err); //扫码失败
        reject(err);
      },
      success: (res: UniApp.ScanCodeSuccessRes) => {
        //扫码成功
        resolve(res);
      }
    });
  });
}

export function formatCashUnit(kbNum: number, decimals = 2) {
  if (kbNum === 0) {
    return "0 KB";
  }
  const k = 1024;
  const dm = decimals < 0 ? 0 : decimals;
  const sizes = ["KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
  const i = Math.floor(Math.log(kbNum) / Math.log(k));
  const result = parseFloat(kbNum / Math.pow(k, i) + "").toFixed(dm);
  return result + sizes[i];
}
